package com.yupi.moonBI.mq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

/**
 * 直连交换机
 */
public class DirectConsumer {
    private static final String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.88.130");
        factory.setPort(5672);
        Connection connection = factory.newConnection();
        //这里创建了两个频道
        /**
         * 在使用消息队列（MQ）时，创建多个频道（Channel）来对应不同的队列（Queue）主要是为了实现不同的功能和需求。
         *
         * 1. 一个频道对应一个队列：这种情况下，每个频道只负责与一个队列进行交互，可以实现对单个队列的独立操作，如发送消息、接收消息等。这种方式适用于需要对每个队列进行单独管理的场景。
         *
         * 2. 一个频道对应两个队列：这种情况下，一个频道可以同时与两个队列进行交互，可以实现在两个队列之间进行消息的转发、订阅等操作。这种方式适用于需要在不同队列之间进行消息传递的场景。
         *
         * 总的来说，创建一个频道对应一个队列还是一个频道对应两个队列，主要取决于你的业务需求和应用场景。如果需要对每个队列进行单独管理，可以使用一个频道对应一个队列的方式；如果需要在多个队列之间进行消息传递，可以使用一个频道对应多个队列的方式。
         */
        Channel channel = connection.createChannel();
        Channel channel2 = connection.createChannel();

        //输入模式：消息：路由键
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        String queueName = "yupi01_queue";
        channel.queueDeclare(queueName, true, false, false, null);
        channel.queueBind(queueName, EXCHANGE_NAME, "yupi01");

        String queueName2 = "yupi02_queue";
        channel2.queueDeclare(queueName2, true, false, false, null);
        //指定该队列绑定多个不同的路由键,该队列可以接收到多个路由键匹配发送来的消息
        String[] routingKeys = {"yupi01", "yupi02"};
        for (String routingKey : routingKeys) {
            channel2.queueBind(queueName2, EXCHANGE_NAME, routingKey);
        }

        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback1 = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [yupi01_queue] Received '" + delivery.getEnvelope().getRoutingKey()+"："+ message + "'");
        };
        DeliverCallback deliverCallback2 = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [yupi02_queue] Received '" + delivery.getEnvelope().getRoutingKey()+"："+ message + "'");
        };
        //消息队列监听
        channel.basicConsume(queueName, true, deliverCallback1, consumerTag -> {
        });
        channel2.basicConsume(queueName2, true, deliverCallback2, consumerTag -> {
        });
    }
}
